/**
 * 
 */
package com.yehongyu.mytools.basic.designpattern.singleton;

/**
 * @author hp 这是一个经典的单例模式的实现，没有想到面对多线程(multithreading)、
 *         类装载器（classloaders）和序列化（serialization）时如何处理这些缺陷。
 *         并且构造方法是protected的，在同一包及子类都可以通过它创建另一个实例。
 */
public class ClassicSingleton {

	private static ClassicSingleton instance = null;

	private static boolean firstThread = true;

	/**
	 * 
	 */
	protected ClassicSingleton() {
	}

	public static ClassicSingleton getInstance() {
		if (instance == null) {
			instance = new ClassicSingleton();
		}
		return instance;
	}
	
	/**
	 * 这种双重加锁检查似乎解决了多线程安全的问题，但是
	 * 
	 * 最简单的方法是创建一个public final static Singleton INSTANCE = new Singleton();
	 * private Singleton(){}
	 * @return
	 */
	public static ClassicSingleton getInstanceForMulThreadSafe(){
		if(instance==null){
			synchronized(ClassicSingleton.class){
				if(instance==null){
					instance = new ClassicSingleton();
				}
			}
		}
		return instance;
	}
	
	public static ClassicSingleton getInstanceWhenMulThread() {
		if (instance == null) {
			simulateRandomActivity();
			instance = new ClassicSingleton();
		}
		return instance;
	}

	private static void simulateRandomActivity() {
		try {
			if (firstThread) {
				firstThread = false;
				System.out.println("sleeping...");

				Thread.sleep(50);
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}